컴퓨터과학
어셈블리_13_안티 디버깅(Anti-Debugging) 탐지 및 우회
작성자 : Heehyeon Yoo|2025-10-29
# Assembly# Anti-Debugging# ptrace# Bypass
개발자는 프로그램 분석을 방해하기 위해 다양한 안티 디버깅(Anti-Debugging) 기법을 적용한다. 리버스 엔지니어링 과정에서 필수적으로 마주치게 되는 ptrace 탐지 기법과 우회 방법을 정리한다.
1. ptrace 탐지 원리
리눅스 디버거(GDB)는 ptrace 시스템 콜을 통해 대상 프로세스를 제어한다. ptrace의 중요한 특징은 "한 프로세스당 하나의 디버거만 붙을 수 있다"는 배타성이다.
안티 디버깅 코드는 이 점을 역이용한다. 프로그램 시작 시 스스로에게 ptrace(PTRACE_TRACEME, ...)를 호출해본다.
- 성공 시: 현재 디버거가 없다는 뜻이다.
- 실패 시: 이미 누군가(GDB)가 나를 디버깅 중이라는 뜻이다. -> 탐지
; 탐지 로직 예시
mov rax, 101 ; sys_ptrace
mov rdi, 0 ; PTRACE_TRACEME
syscall
cmp rax, 0
jl debugger_found ; 음수(에러)면 디버깅 중임
2. 우회 전략(Bypass)
커널이 반환하는 시스템 콜 결과를 조작하여 우회할 수 있다.
ptrace호출 직후에 Breakpoint를 건다 (catch syscall ptrace).RAX레지스터에 저장된 리턴값을 확인한다. (디버깅 중이면 -1)set $rax = 0명령어로 리턴값을 0(성공)으로 조작한다.
프로그램은 자신이 성공적으로 ptrace를 호출했다고 착각하고, 정상적인 실행 흐름을 이어간다. 탐지 로직을 무력화(NOP 패치)하거나 리턴값을 조작하는 것이 안티 디버깅 대응의 핵심이다.